home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1997 December / MACPOWER-1997-12.ISO.7z / MACPOWER-1997-12.ISO / AMUG / PROGRAMMING / Raven 1.2.sit / Raven 1.2 / Source / Foundation / Common / ZNewAndDelete.cpp < prev    next >
Text File  |  1997-08-02  |  4KB  |  181 lines

  1. /*
  2.  *  File:       ZNewAndDelete.cpp
  3.  *  Summary:    Default Raven global operator new.
  4.  *  Written by: Jesse Jones
  5.  *
  6.  *  Copyright ゥ 1997 Jesse Jones. 
  7.  *    For conditions of distribution and use, see copyright notice in ZTypes.h  
  8.  *
  9.  *  Change History (most recent first):
  10.  *
  11.  *         <2>     8/01/97    JDJ        Added gValidateHeapOnDelete.
  12.  *         <1>     1/28/97    JDJ        Created
  13.  */
  14.  
  15. #include <ZNewAndDelete.h>
  16.  
  17. #include <ZDebug.h>
  18. #include <ZExceptions.h>
  19. #include <ZMemoryHeap.h>
  20.  
  21.  
  22. //-----------------------------------
  23. //    Globals
  24. //
  25. TMemoryHeap* gObjectHeap = nil;
  26.  
  27. #if DEBUG
  28. bool gValidateHeapOnNew    = false;
  29. bool gValidateHeapOnDelete = false;
  30. bool gFreeDeletedBlocks    = true;    
  31. #endif
  32.  
  33.  
  34. // ===================================================================================
  35. //    Global New and Delete
  36. // ===================================================================================
  37.  
  38. //---------------------------------------------------------------
  39. //
  40. // operator new (size_t)
  41. //
  42. //---------------------------------------------------------------
  43. #if RAVEN_OPERATOR_NEW && 1
  44. void* operator new(size_t size) throw(bad_alloc)
  45. {
  46.    return RavenOperatorNew(size);
  47. }
  48. #endif
  49.  
  50.  
  51. //---------------------------------------------------------------
  52. //
  53. // operator new (size_t, nothrow_t)
  54. //
  55. //---------------------------------------------------------------
  56. #if RAVEN_OPERATOR_NEW && 0                // ・・・ハCW 11 gives a warning that this is already defined
  57. void* operator new(size_t size, const nothrow_t&) throw()
  58. {
  59.     void* ptr = nil;
  60.     
  61.     try {
  62.            ptr = RavenOperatorNew(size);
  63.            
  64.        } catch (...) {
  65.        }
  66.        
  67.        return ptr;
  68. }
  69. #endif
  70.  
  71.  
  72. //---------------------------------------------------------------
  73. //
  74. // operator delete
  75. //
  76. //---------------------------------------------------------------
  77. #if RAVEN_OPERATOR_NEW && 1
  78. void operator delete(void* obj)
  79. {
  80.     RavenOperatorDelete(obj);
  81. }
  82. #endif
  83.  
  84. #pragma mark -
  85.  
  86. // ===================================================================================
  87. //    class TDisableLeakChecking
  88. // ===================================================================================
  89.  
  90. //---------------------------------------------------------------
  91. //
  92. // TDisableLeakChecking::~TDisableLeakChecking
  93. //
  94. // It's be nicer to stub these out in the header, but that causes
  95. // problems if you use them in a library.
  96. //
  97. //---------------------------------------------------------------
  98. TDisableLeakChecking::~TDisableLeakChecking()
  99. {
  100. #if DEBUG
  101.     (gObjectHeap->mLeakChecking)++;
  102. #endif
  103. }
  104.  
  105.  
  106. //---------------------------------------------------------------
  107. //
  108. // TDisableLeakChecking::TDisableLeakChecking
  109. //
  110. //---------------------------------------------------------------
  111. TDisableLeakChecking::TDisableLeakChecking()
  112. {
  113. #if DEBUG
  114.     ASSERT(gObjectHeap != nil);
  115.     
  116.     (gObjectHeap->mLeakChecking)--;
  117. #endif
  118. }
  119.  
  120. #pragma mark -
  121.  
  122. // ===================================================================================
  123. //    Global Functions
  124. // ===================================================================================
  125.  
  126. //---------------------------------------------------------------
  127. //
  128. // RavenOperatorNew
  129. //
  130. //---------------------------------------------------------------
  131. void* RavenOperatorNew(size_t size)
  132. {
  133.     ASSERT(gObjectHeap != nil);            // should have been created by FragInit (in ZBootStrap.cpp)
  134.     
  135.     void* block = nil;
  136.  
  137. #if DEBUG
  138.     if (gValidateHeapOnNew)
  139.         gObjectHeap->ValidateHeap();
  140. #endif
  141.  
  142.     // Try to create the block. Will throw if the new handler
  143.     // can't free up any memory or there is no new handler.
  144.     while (block == nil) {
  145.         block = gObjectHeap->Allocate(size);
  146.         
  147.         if (block == nil) {
  148.             new_handler handler = set_new_handler(nil);        // there's no get_new_handler!
  149.             set_new_handler(handler);
  150.             
  151.             if (handler != nil)
  152.                 (*handler)();                                // if handler can't free up any memory it will throw
  153.             else
  154.                 throw TSysMemoryException();
  155.         }
  156.     }
  157.     
  158.     return block;
  159. }
  160.  
  161.  
  162. //---------------------------------------------------------------
  163. //
  164. // RavenOperatorDelete
  165. //
  166. //---------------------------------------------------------------
  167. void RavenOperatorDelete(void* obj)
  168. {
  169.     ASSERT(gObjectHeap != nil);
  170.     
  171. #if DEBUG
  172.     if (gValidateHeapOnDelete)
  173.         gObjectHeap->ValidateHeap();
  174.  
  175.     if (gFreeDeletedBlocks)
  176. #endif
  177.         gObjectHeap->Deallocate(obj);
  178. }
  179.  
  180.  
  181.